﻿#pragma once
#define LK_WEAK_
namespace LK
{
	/**@brief 代理类的弱引用*/
	template<class T>struct weak :T
	{
		//默认构造空引用
		weak();
		//默认构造空引用
		weak(null_t);
		//构造，并不会导致对象引用计数变化
		weak(typename TypeOfReference<T>::T const* ptr);
		//构造，并不会导致对象引用计数变化
		weak(const T& w);
		//复制构造函数，并不会导致对象引用计数变化
		weak(const weak&w);
		//从其他类型弱引用构造
		template<class AnyT>weak(weak<AnyT>const& w, typename UseIf<IsBaseOf<typename TypeOfReference<T>::T, typename TypeOfReference<AnyT>::T>::V>::T*p = NULL);
		//赋值，置空
		weak& operator=(const weak&w) ;
		//赋值，并不会导致对象引用计数变化
		weak& operator=(null_t) ;
		//析构，并不会导致对象引用计数变化
		~weak();
	protected:
		//设置为空，并不会导致对象引用计数变化
		void SetToNull();
		//设置另一个引用，并不会导致对象引用计数变化
		void SetTo(typename TypeOfReference<T>::T const*p);
	};
	/**@brief 代理类的弱引用*/
	template<class T>struct weakptr:weak<ptr<T> >
	{
		//默认构造空引用
		weakptr() {}
		//构造，并不会导致对象引用计数变化
		weakptr(T const* p) :weak<ptr<T> >(p) {}
		//构造空引用
		weakptr(null_t) :weak<ptr<T> >(null) {}
		//构造，并不会导致对象引用计数变化
		weakptr(const ptr<T>& w) :weak<ptr<T> >(w) {}
		//复制构造函数，并不会导致对象引用计数变化
		weakptr(const weakptr&w) :weak<ptr<T> >(w) {}
		//从其他类型弱引用构造
		template<class AnyT>weakptr(weakptr<AnyT>const& w, typename UseIf<IsBaseOf<T, AnyT>::V>::T*p = NULL)
			:weak<ptr<T> >(w,p) {}
		//赋值，并不会导致对象引用计数变化
		weakptr& operator=(const weakptr&w) { *(weak<ptr<T> >*)this = w; return *this; }
		//置空
		weakptr& operator=(null_t) { *(weak<ptr<T> >*)this = null; return *this; }
	};
}
